package com.pic.mgt.monitor;

import java.io.FileNotFoundException;
import java.io.FilenameFilter;

public interface UnitMonitor {
	
	/**
	 * 註冊單元到達通知
	 * (在還未開始監控的情況下,才能夠設定)
	 * @param listener
	 */
	public void setUnitMonitorListener(UnitMonitorListener listener);
	
	/**
	 * 移除單元到達通知
	 * (在還未開始監控的情況下,才能夠設定)
	 */
	public void removeUnitMonitorListener();
	
	/**
	 * 設定監控目錄 (增加監控目錄)
	 * (在還未開始監控的情況下,才能夠設定)
	 * @param monitorPath
	 */
	public void setMonitorPath(String ... monitorPath) throws UnitMonitorException;
	
	/**
	 * 增加監控目錄至清單中，如果監控狀態是開始的情況下，則會直接開始進行監控。
	 * @param monitorPath
	 */
	public void addMonitorPath(String monitorPath) throws UnitMonitorException;
	
	/**
	 * 停止目錄的監控，並從清單中移除。
	 * @param monitorPathStr
	 */
	public void removeMonitorPath(String monitorPathStr);
	
	/**
	 * 移除監控目錄
	 * (在還未開始監控的情況下,才能夠設定)
	 */
	public void removeAllMonitorPath();
	
	/**
	 * 針對讓某一個目錄停止監控。呼叫本方法前是所監控的目錄，已經先行
	 * 新增 (addMonitorPath(String))於清單中，並且監控狀態是在開始(MONITOR_STARTED)的情況下才會生效。
	 */
	public void stopWatchMonitorPath(String monitorPathStr);
	
	/**
	 * 如果有呼叫 stopWatchMonitorPath(String) 方法來針對讓某一個目錄停止監控，
	 * 則可以呼叫此方法，同樣針對該目錄繼續開始監控。呼叫本方法前是所監控的目錄，已經先行
	 * 新增 (addMonitorPath(String))於清單中，並且監控狀態是在開始(MONITOR_STARTED)的情況下才會生效。
	 * @param monitorPathStr
	 */
	public void startWatchMonitorPath(String monitorPathStr) throws UnitMonitorException;
	
	/**
	 * 停止所有目錄的監控，但不從清單中移除。
	 * @param monitorPathStr
	 */
	public void stopAllMonitorPath();
	
	/**
	 * 設定(新增)過濾器，用來做為判斷確認檔檔名的規則
	 * (在還未開始監控的情況下,才能夠設定)
	 * @param filenameFilter
	 */
	public void setFilenameFilter(FilenameFilter ... filenameFilter);
	
	/**
	 * 新增過濾器，用來做為判斷確認檔檔名的規則
	 * (在還未開始監控的情況下,才能夠設定)
	 * @param filenameFilter
	 */
	public void addFilenameFilter(FilenameFilter filenameFilter);

	/**
	 * 移除過濾器
	 * (在還未開始監控的情況下,才能夠設定)
	 */
	public void removeAllFilenameFilter();
	
	/**
	 * 開始單元監控
	 * @throws UnitMonitorException
	 * 				 發生 UnitMonitorException 有二種情況:
	 * 				(1) 在建立底層檔案監控元件時發生的錯誤，此時完全無法監控(監控狀態也不會是在 running 的狀態)。
	 * 				(2) 建立底層檔案監控元件成功，但在加入目錄監控時發生錯誤(有可能是目錄不存在或其它狀況等)，此
	 * 					時要注意的是監控狀態會是在 running ，並且先前有加入目錄監控成功的目錄應是正常在監控的。
	 */
	public void startUnitMonitor() throws UnitMonitorException;
	
	/**
	 * 停止單元監控
	 * @throws FileNotFoundException
	 */
	public void stopUnitMonitor();
	
	public boolean isUnitMonitorRunning();

}